package com.bawei.lib_common.utils

import android.util.Log
import com.bawei.lib_net.datastore.DataStoreUtils
import com.bawei.lib_storage.mmkv.AuthMMKV
import com.google.gson.Gson
import com.google.gson.JsonSyntaxException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

/**
 * 用户工具类
 */
object UserUtils {
    
    private const val TAG = "UserUtils"
    private val gson = Gson()
    
    // 与登录时保存用户信息的key保持一致
    private const val CURRENT_USER_KEY = "currentuser"
    
    /**
     * 用户信息数据类
     */
    data class UserInfo(
        val id: Int,
        val username: String,
        val token: String,
        val accountid: Any?,
        val ctime: String?,
        val headImg: Any?,
        val isAuthor: Any?,
        val nick: Any?,
        val password: String?
    )
    
    /**
     * 获取当前登录用户ID
     */
    fun getCurrentUserId(): String {
        return try {
            // 优先从MMKV获取用户ID
            if (AuthMMKV.hasLogin()) {
                // 从DataStore获取用户信息
                val userJson = DataStoreUtils.getData(CURRENT_USER_KEY, "")
                if (userJson.isNotEmpty()) {
                    try {
                        val userInfo = gson.fromJson(userJson, UserInfo::class.java)
                        userInfo.id.toString()
                    } catch (e: JsonSyntaxException) {
                        Log.e(TAG, "解析用户信息失败: ${e.message}", e)
                        ""
                    }
                } else {
                    ""
                }
            } else {
                ""
            }
        } catch (e: Exception) {
            Log.e(TAG, "获取用户ID失败: ${e.message}", e)
            ""
        }
    }
    
    /**
     * 检查用户是否已登录
     */
    fun isUserLoggedIn(): Boolean {
        return getCurrentUserId().isNotEmpty()
    }
    
    /**
     * 获取默认用户ID（用于未登录状态）
     */
    fun getDefaultUserId(): String {
        return "guest_${System.currentTimeMillis()}"
    }
    
    /**
     * 获取当前用户信息
     */
    fun getCurrentUserInfo(): UserInfo? {
        return try {
            val userJson = DataStoreUtils.getData(CURRENT_USER_KEY, "")
            if (userJson.isNotEmpty()) {
                gson.fromJson(userJson, UserInfo::class.java)
            } else {
                null
            }
        } catch (e: Exception) {
            Log.e(TAG, "获取用户信息失败: ${e.message}", e)
            null
        }
    }
    
    /**
     * 退出登录，清除本地用户信息
     */
    fun clearLoginInfo() {
        try {
            // 清除MMKV登录状态
            com.bawei.lib_storage.mmkv.AuthMMKV.token = ""
            
            // 在协程中清除DataStore中的用户信息
            CoroutineScope(Dispatchers.IO).launch {
                try {
                    com.bawei.lib_net.datastore.DataStoreUtils.clear()
                } catch (e: Exception) {
                    Log.e(TAG, "清除DataStore失败: ${e.message}", e)
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, "清除登录信息失败: ${e.message}", e)
        }
    }
} 